// leftover.cpp -- overloading the left() function
#include <iostream> // 包含输入输出流的库

// 函数声明：返回一个无符号长整型数的前ct个数字
unsigned long left(unsigned long num, unsigned ct);

// 函数声明：返回一个指向新字符串的指针，该字符串包含str字符串的前n个字符
char *left(const char *str, int n = 1); // 默认参数n为1

int main() {
    using namespace std; // 使用标准命名空间
    char *trip = "Hawaii!!"; // 测试值：字符串
    unsigned long n = 12345678; // 测试值：无符号长整型数字
    int i; // 循环变量
    char *temp; // 存储返回的字符串指针

    // 循环输出1到9之间的数字
    for (i = 1; i < 10; i++) {
        // 输出数字n的前i个数字
        cout << left(n, i) << endl;
        // 调用left()函数获取trip字符串的前i个字符，并存储在temp中
        temp = left(trip, i);
        cout << temp << endl; // 输出获取的字符
        delete [] temp; // 释放动态分配的内存，避免内存泄漏
    }
    // cin.get(); // 暂停程序，等待用户输入（已注释）
    return 0; // 程序结束
}

// 该函数返回数字num的前ct个数字。
// 如果ct为0或num为0，则返回0。
unsigned long left(unsigned long num, unsigned ct) {
    unsigned digits = 1; // 记录数字的位数，初始为1
    unsigned long n = num; // 使用副本n来计算位数

    if (ct == 0 || num == 0)
        return 0; // 如果没有要返回的位数或数字为0，则返回0

    // 计算num的位数
    while (n /= 10)
        digits++; // 每次除以10，位数加1

    // 如果要求的位数超过了数字的位数
    if (digits > ct) {
        ct = digits - ct; // 计算需要丢弃的位数
        while (ct--)
            num /= 10; // 逐位除以10，丢弃末尾的位数
        return num; // 返回处理后的数字
    } else // 如果ct大于等于数字的位数
        return num; // 返回整个数字
}

// 该函数返回一个指向新字符串的指针，
// 新字符串由str字符串的前n个字符组成。
char *left(const char *str, int n) {
    if (n < 0) // 如果n小于0，设置为0
        n = 0;

    // 动态分配内存以存储结果字符串，大小为n + 1（包括结束符）
    char *p = new char[n + 1];
    int i; // 循环变量

    // 复制str中的前n个字符到新字符串p中
    for (i = 0; i < n && str[i]; i++)
        p[i] = str[i]; // 逐字符复制

    // 在新字符串的剩余部分填充'\0'结束符
    while (i <= n)
        p[i++] = '\0'; // 结尾填充'\0'

    return p; // 返回指向新字符串的指针
}
